import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

public class LevelFileLoader {

	protected BufferedReader mReader;

	protected final Level mLevel = new Level(0, 0);

	public boolean loadFile() {

		boolean fileOpened = false;

		JFileChooser fileChooser = new JFileChooser();

		if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {

			File levelFile = fileChooser.getSelectedFile();
			fileOpened = true;
			try {
				this.mReader = new BufferedReader(new FileReader(levelFile));
			} catch (Exception e) {
				e.printStackTrace();
				JOptionPane.showMessageDialog(
						null,
						"Erreur lors de l'ouverture du fichier '"
								+ levelFile.getAbsolutePath() + "'");
			}
		}

		// Si le fichier a été ouvert
		if (fileOpened) {
			this.loadLevel();
		}

		return fileOpened;
	}

	private void extractFirstLine(String aFirstLine) {
		String[] values = aFirstLine.split(" ");

		// Si tous les paramètres sont présents
		if (values.length == 7) {

			// Extraction des paramètres de la map
			try {
				this.mLevel.setPacManSpeedField(Integer.parseInt(values[2]));
				this.mLevel.setGhostNormalSpeedField(Integer
						.parseInt(values[3]));
				this.mLevel.setGhostVulnerableSpeedField(Integer
						.parseInt(values[4]));
				this.mLevel.setGhostIntelligence(Integer.parseInt(values[5]));
				this.mLevel.setPowerBallDurationField(Integer
						.parseInt(values[6]));

			} catch (NumberFormatException nfe) {
				nfe.printStackTrace();
			}
		}
	}

	private void loadLevel() {

		try {
			try {
				String line;

				// Extraction de la première ligne  de données(avec la taille et les
				// paramètres)
				line = this.mReader.readLine();
				this.extractFirstLine(line);

				while ((line = this.mReader.readLine()) != null) {
					this.addLine(line);
				}

				this.mLevel.updateGraphicalMap();
			} finally {
				this.mReader.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(null, "Une erreur est survenue!");
		}

	}

	private void addLine(String aLine) {

		List<LevelCase> levelCaseLine = new ArrayList<LevelCase>();
		String[] values = aLine.split(" ");
		Integer currentValue;

		// Parcours de toutes les valeurs de la ligne
		for (int i = 0; i < values.length; i++) {
			try {
				currentValue = Integer.parseInt(values[i]);
			} catch (NumberFormatException nfe) {
				nfe.printStackTrace();
				currentValue = 1;
			}

			levelCaseLine.add(new LevelCase(currentValue));
		}

		// Mise à jour de la taille de la map.
		this.mLevel.setSizeY(this.mLevel.getSizeY() + 1);
		this.mLevel.setSizeX(levelCaseLine.size());

		// Ajout de la nouvelle ligne.
		this.mLevel.getMap().add(0, levelCaseLine);

	}

	public Level getLoadedLevel() {
		return this.mLevel;
	}

}
